
// Promise 的构造函数需要接受一个函数作为参数，这个函数就可以理解为对象承诺的逻辑
// 这个函数会在构造 Promise 的过程中被同步执行
// 这个函数接受两个参数 resolve/reject，分别将 Promise 的状态改为成功、失败
// 状态是确定的，也就是说只会调用 resolve/reject 之一
// const promise = new Promise(function(resolve,reject){
//   console.log('start')
//   resolve(100)
//   reject(new Error('rejected')) // 一般传递一个错误对象，表示为什么失败
// })

// promise.then(function(value){
//   console.log('resolve',value)
// },function(error){
//   console.log('error',error)
// })
// console.log('end')


// function ajax (url) {
//   return new Promise(function (resolve, reject) {
//     const xhr = new XMLHttpRequest()
//     xhr.open('GET', url)
//     xhr.responseType = 'json' // html5 新特性，获取 json 对象
//     xhr.onload = function () { //  html5 新特性，readystate === 4 请求完成之后
//       if (xhr.status === 200) {
//         resolve(this.response)
//       } else {
//         reject(new Error(this.statusText))
//       }
//     }
//     xhr.send()
//   })
// }
// ajax('./').then(function (res) {
//   console.log(res)
// }, function (err) {
//   console.log(err)
// })

// function ajax (url) {
//   return new Promise(function (resolve, reject) {
//     const xhr = new XMLHttpRequest()
//     xhr.open('GET', url)
//     xhr.responseType = 'json' // html5 新特性，获取 json 对象
//     xhr.onload = function () { //  html5 新特性，readystate === 4 请求完成之后
//       if (xhr.status === 200) {
//         resolve(this.response)
//       } else {
//         reject(new Error(this.statusText))
//       }
//     }
//     xhr.send()
//   })
// }
// const promise1 = ajax('./')
// const promise2 = promise1.then(function (res) {
// }, function (err) {
// })
// console.log(promise2 === promise1)

// function ajax (url) {
//   return new Promise(function (resolve, reject) {
//     const xhr = new XMLHttpRequest()
//     xhr.open('GET', url)
//     xhr.responseType = 'json' // html5 新特性，获取 json 对象
//     xhr.onload = function () { //  html5 新特性，readystate === 4 请求完成之后
//       if (xhr.status === 200) {
//         resolve(this.response)
//       } else {
//         reject(new Error(this.statusText))
//       }
//     }
//     xhr.send()
//   })
// }
// const promise1 = ajax('./').then(function (res) {
//   return ajax('/ada/dad')
// }, function (err) {
//   // 捕捉不到 /ada/dad 的异常
//   console.log(err)
// }).catch(function (err) {
//   // 可以捕捉到
//   console.log('catch', err) // catch Error: Not Found at XMLHttpRequest.xhr.onload
// })

// process.on('unhandledRejection', (reason, promise) => {
//   console.log(reason, promise)
// })

// Promise.resolve(100).then(res => console.log(res))

// const timeOutPromise = new Promise(function(resolve,reject){
//   setTimeout(()=>{
//     console.log('time out')
//   },500)
// })
// const promise = Promise.resolve(timeOutPromise)
// console.log(promise)

// Promise.resolve({
//   then (onFulFilled, onRejected) {
//     onFulFilled('then')
//   }
// }).then(value => {
//   console.log(then)
// })

// let conut = 0
// for(const i = 0;i<1000;i++){
//   setTimeout(()=>{
//     i++
//   },Math.random())
// }

// Promise.all([
//   new Promise((resolve) => {
//     setTimeout(() => {
//       resolve('timer1 500')
//     }, 500)
//   }),
//   new Promise((resolve) => {
//     setTimeout(() => {
//       resolve('timer2 1000')
//     }, 1000)
//   })
// ]).then(res => {
//   console.log(res) // ["timer1 500", "timer2 1000"]
// })


// console.log('start')

// setTimeout(() => console.log('timeout'), 0)

// Promise.resolve().then(() => console.log('then1'))
//   .then(() => console.log('then2'))
//   .then(() => console.log('then3'))

// new Promise((resolve, reject) => {
//   console.log('promise2');
//   resolve(1)
// }).then(() => console.log('promise2 then1'))
//   .then(() => console.log('promise2 then2'))

// console.log('end')


// function * test(){
//   console.log('test')
//   const req1 = yield 1
//   console.log(req1)
//   try {
//     const req2 = yield 2
//     console.log(req2)
//   } catch (error) {
//     console.log(error)
//   }
//   yield 3
// }
// // 以下不会立即执行
// const generator  = test()
// console.log(generator.next())
// // test
// // {value: 1, done: false}
// console.log(generator.next('传入A'))
// // 传入A
// // {value: 2, done: false}
// generator.throw(new Error('Generator Error'))
// // Error: Generator Error
// //     at eval (eval at <anonymous> (VM1178:8), <anonymous>:17:17)
// //     at VM1179:18
// // {value: 3, done: false}


// function timeOut (id) {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       if (id < 24) {
//         resolve({ name: "小明" + id, age: id, id: id })
//       } else {
//         reject(new Error('ID 超过24'))
//       }
//     }, 1000)
//   })
// }
// function* main () {
//   try {
//     const res1 = yield timeOut(1)
//     console.log(res1)
//     const res2 = yield timeOut(12)
//     console.log(res2)
//     const res3 = yield timeOut(18)
//     console.log(res3)
//     const res4 = yield timeOut(24)
//     console.log(res4)
//   } catch (error) {
//     console.log(error)
//   }
// }
// function exec (fun) {
//   const generator = fun()
//   function handleResult (result) {
//     if (result.done) {
//       return
//     }
//     result.value.then(data => {
//       handleResult(generator.next(data))
//     }, error => {
//       generator.throw(error)
//     })
//   }
//   handleResult(generator.next())
// }
// exec(main)


function timeOut (id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id < 24) {
        resolve({ name: "小明" + id, age: id, id: id })
      } else {
        reject(new Error('ID 超过24'))
      }
    }, 1000)
  })
}
async function main () {
  try {
    const res1 = await timeOut(1)
    console.log(res1)
    const res2 = await timeOut(12)
    console.log(res2)
    const res3 = await timeOut(18)
    console.log(res3)
    const res4 = await timeOut(24)
    console.log(res4)
  } catch (error) {
    console.log(error)
  }
}
main()




